# Copyright (c) 2020 Stephanos Ioannidis <root@stephanos.io>
# SPDX-License-Identifier: Apache-2.0

zephyr_library()

zephyr_library_sources(
  arm_bitreversal.c
  arm_bitreversal2.c
  # NOTE: The ASM implementation of `arm_bitreversal2` is disabled for now in
  #       order to allow the compiler to perform ISA and microarchitecture-
  #       specific optimisations. This may be re-enabled in the future when we
  #       have a more advanced implementation that supports ARMv8.1-M MVE.
  # arm_bitreversal2.S
)

if(
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_16   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_32   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_64   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_128  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_256  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_512  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_1024 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_2048 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F64_4096
  )

  zephyr_library_sources(
    arm_cfft_f64.c
    arm_cfft_init_f64.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_16   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_32   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_64   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_128  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_256  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_512  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_1024 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_2048 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_F32_4096
  )

  zephyr_library_sources(
    arm_cfft_radix2_f32.c
    arm_cfft_radix4_f32.c
    arm_cfft_radix8_f32.c
    arm_cfft_f32.c
    arm_cfft_init_f32.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_16   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_32   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_64   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_128  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_256  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_512  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_1024 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_2048 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q31_4096
  )

  zephyr_library_sources(
    arm_cfft_radix2_q31.c
    arm_cfft_radix4_q31.c
    arm_cfft_q31.c
    arm_cfft_init_q31.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_16   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_32   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_64   OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_128  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_256  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_512  OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_1024 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_2048 OR
  CONFIG_CMSIS_DSP_TABLES_CFFT_Q15_4096
  )

  zephyr_library_sources(
    arm_cfft_radix2_q15.c
    arm_cfft_radix4_q15.c
    arm_cfft_q15.c
    arm_cfft_init_q15.c
    )

endif()

if(CONFIG_CMSIS_DSP_TABLES_ALL_FFT)

  zephyr_library_sources(
    arm_cfft_radix2_init_q15.c
    arm_cfft_radix2_init_q31.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_32    OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_64    OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_128   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_256   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_512   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_1024  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_2048  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F64_4096
  )

  zephyr_library_sources(
    arm_rfft_fast_f64.c
    arm_rfft_fast_init_f64.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_32    OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_64    OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_128   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_256   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_512   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_1024  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_2048  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_FAST_F32_4096
  )

  zephyr_library_sources(
    arm_rfft_fast_f32.c
    arm_rfft_fast_init_f32.c
    arm_cfft_f32.c
    arm_cfft_init_f32.c
    arm_cfft_radix8_f32.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_RFFT_F32_128  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_F32_512  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_F32_2048 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_F32_8192
  )

  zephyr_library_sources(
    arm_rfft_init_f32.c
    arm_rfft_f32.c
    arm_cfft_radix4_init_f32.c
    arm_cfft_radix4_f32.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_32   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_64   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_128  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_256  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_512  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_1024 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_2048 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_4096 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q31_8192
  )

  zephyr_library_sources(
    arm_rfft_init_q31.c
    arm_rfft_q31.c
    arm_cfft_q31.c
    arm_cfft_init_q31.c
    arm_cfft_radix4_q31.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_32   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_64   OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_128  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_256  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_512  OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_1024 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_2048 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_4096 OR
  CONFIG_CMSIS_DSP_TABLES_RFFT_Q15_8192
  )

  zephyr_library_sources(
    arm_rfft_init_q15.c
    arm_rfft_q15.c
    arm_cfft_q15.c
    arm_cfft_init_q15.c
    arm_cfft_radix4_q15.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_DCT4_F32_128  OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_F32_512  OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_F32_2048 OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_F32_8192
  )

  zephyr_library_sources(
    arm_dct4_f32.c
    arm_dct4_init_f32.c

    arm_rfft_init_f32.c
    arm_rfft_f32.c
    arm_cfft_radix4_init_f32.c
    arm_cfft_radix4_f32.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q31_128  OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q31_512  OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q31_2048 OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q31_8192
  )

  zephyr_library_sources(
    arm_dct4_q31.c
    arm_dct4_init_q31.c

    arm_rfft_init_q31.c
    arm_rfft_q31.c
    arm_cfft_q31.c
    arm_cfft_init_q31.c
    arm_cfft_radix4_init_q31.c
    arm_cfft_radix4_q31.c
    )

endif()

if(
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q15_128  OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q15_512  OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q15_2048 OR
  CONFIG_CMSIS_DSP_TABLES_DCT4_Q15_8192
  )

  zephyr_library_sources(
    arm_dct4_q15.c
    arm_dct4_init_q15.c

    arm_rfft_init_q15.c
    arm_rfft_q15.c
    arm_cfft_q15.c
    arm_cfft_init_q15.c
    arm_cfft_radix4_init_q15.c
    arm_cfft_radix4_q15.c
    )

endif()

if(CONFIG_CMSIS_DSP_WRAPPER)

  zephyr_library_sources(
    arm_cfft_radix2_init_f32.c
    )

endif()
